﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CROSLAND.BL.BE;
using CROSLAND.BL.BC;
using AjaxControlToolkit;

namespace CROSLAND.WebApp
{
    public partial class StockVMS : System.Web.UI.Page
    {
        /// <summary>
        /// Almacena el resultado de la búsquda
        /// </summary>
        public List<ReservaBE> ListaMaterial
        {
            get
            {
                return (Session["SesionVehiculos"] != null) ?
                    (List<ReservaBE>)Session["SesionVehiculos"] : new List<ReservaBE>();
            }
            set { Session["SesionVehiculos"] = value; }
        }

        /// <summary>
        /// Almacena los materiales a reservar
        /// </summary>
        public List<ReservaBE> ListaReserva
        {
            get
            {
                return (Session["SesionSeleccion"] != null) ?
                     (List<ReservaBE>)Session["SesionSeleccion"] : new List<ReservaBE>();
            }
            set { Session["SesionSeleccion"] = value; }
        }
            


        /// <summary>
        /// Evento de carga de la página
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            btnCampania.Visible = true;
            btnCrearPedido.Visible = true;
            if (ParametroBC.Instance.getParamValue("TipoApp") == "0")
            {
                btnCampania.Visible = false;
                btnCrearPedido.Visible = false;
            }
            

            if (!Page.IsPostBack)
            {
                Dictionary<string, List<GenericBE>> dict = (Dictionary<string, List<GenericBE>>)Session["CargarCombos"];

                cmbColor.DataValueField = "Codigo";
                cmbColor.DataTextField = "Descripcion";
                cmbColor.DataSource = dict["color"].ToList();
                cmbColor.DataBind();

                cmbGrpArt.DataValueField = "Codigo";
                cmbGrpArt.DataTextField = "Descripcion";
                cmbGrpArt.DataSource = dict["grpArt"].ToList();
                cmbGrpArt.DataBind();

                cmbDispo.DataValueField = "Codigo";
                cmbDispo.DataTextField = "Descripcion";
                cmbDispo.DataSource = dict["disponibilidad"].ToList();
                cmbDispo.DataBind();

                
                this.tvJerarquiasRender();               
                this.Buscar();
            }
        }


        protected void tvJerarquia_SelectedNodeChanged(object sender, EventArgs e)
        {            
            this.Buscar();
        }

        protected void tvJerarquia_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            if (e.Node.Value == "0")
            {
                List<JerarquiaBE> lstNivel1 = JerarquiaBC.Instance.listar(1);
                foreach (JerarquiaBE obj in lstNivel1)
                {
                    TreeNode root = new TreeNode(obj.Descripcion, obj.Jerarquia + ':' + obj.Nivel.ToString());
                    root.PopulateOnDemand = true;
                    e.Node.ChildNodes.Add(root);
                }
            }
            else
            {
                string[] aux = e.Node.Value.Split(':');
                List<JerarquiaBE> lstNiveli = JerarquiaBC.Instance.Buscar(Convert.ToInt32(aux[1]) + 1, aux[0]);
                foreach (JerarquiaBE obj in lstNiveli)
                {
                    TreeNode node = new TreeNode(obj.Descripcion, obj.Jerarquia + ':' + obj.Nivel.ToString());
                    node.PopulateOnDemand = true;
                    e.Node.ChildNodes.Add(node);
                }
            }
        }


        private void tvJerarquiasRender()
        {
            TreeNode tn = new TreeNode("TODAS", "0");
            tn.PopulateOnDemand = true;
            tn.Selected = true;
            tvJerarquia.Nodes.Add(tn);
        }

        protected void txtCodCliente_TextChanged(object sender, EventArgs e)
        {
            ////UsuarioWebBE uWeb = new UsuarioWebBE();
            ////uWeb = (UsuarioWebBE)Session["UsuarioWeb"];
            
            ////ClienteBE entity = ClienteBC.Instance.leer(txtCodCliente.Text, uWeb);

            ////if (entity != null)
            ////{
            ////    this.txtCodCliente.Text = entity.Codigo;
            ////    this.txtNomCliente.Text = entity.Descripcion;
            ////}
        }

        [System.Web.Services.WebMethod]
        [System.Web.Script.Services.ScriptMethod]
        public static string[] buscaClientes(string prefixText, int count)
        {
            string[] retVal;
            UsuarioWebBE uWeb = new UsuarioWebBE();
            uWeb = (UsuarioWebBE)HttpContext.Current.Session["UsuarioWeb"];
            List<ClienteBE> lstClientes = ClienteBC.Instance.buscarCliente("", prefixText, uWeb);
            List<string> lst = new List<string>();
            int total = lstClientes.Count < count ? lstClientes.Count : count;
            for (int i = 0; i < total; i++)
            {
                string item = AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem(lstClientes[i].Descripcion, lstClientes[i].Codigo);
                lst.Add(item);
            }
            retVal = lst.ToArray();
            return retVal;
        }

        /// <summary>
        /// Permite levantar el díalogo de reservas
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnReserva_Click(object sender, EventArgs e)
        {            
            this.ListaReserva = null;
            this.AgregarReserva();
        }

        protected void btnCampania_Click(object sender, EventArgs e)
        {
            this.ListaReserva = null;
            this.AgregarCampania();
        }

        
        /// <summary>
        /// Permite realizar la búsqueda de clientes
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            this.Buscar();
        }

        /// <summary>
        /// Permite mostrar los materiale dependiendo del criterio de búsqueda
        /// </summary>
        protected void Buscar()
        {
            try
            {
                this.ListaMaterial = null;
                string material = (!string.IsNullOrEmpty(this.txtMaterial.Text)) ? this.txtMaterial.Text : null;
                string color = (!string.IsNullOrEmpty(this.cmbColor.SelectedValue)) ? this.cmbColor.SelectedValue : null;
                string lote = (!string.IsNullOrEmpty(this.txtLote.Text)) ? this.txtLote.Text : null;
                string jerarquia = (!string.IsNullOrEmpty(tvJerarquia.SelectedValue)) ? this.tvJerarquia.SelectedValue.Replace(":1", "").Replace(":2", "") : null;
                string grupoArticulos = (!string.IsNullOrEmpty(this.cmbGrpArt.SelectedValue)) ? this.cmbGrpArt.SelectedValue : null;
                string anioFabricacion = (!string.IsNullOrEmpty(this.txtAnioFabricacion.Text)) ? this.txtAnioFabricacion.Text : null;
                string disponiblidad = (!string.IsNullOrEmpty(this.cmbDispo.SelectedValue)) ? this.cmbDispo.SelectedValue : null;
                UsuarioWebBE usr = (UsuarioWebBE)Session["UsuarioWeb"];

                this.ListaMaterial = StockBC.Instance.buscarStockVMS(material, color, usr.centro, usr.almacen, lote,
                    jerarquia, grupoArticulos, anioFabricacion, disponiblidad);
                this.gvListado.DataSource = this.ListaMaterial;
                this.gvListado.DataBind();

                if (ListaMaterial.Count == 0)
                {
                    Session["Mensaje"] = "No se encontraron resultados";
                }
            }
            catch (Exception ex)
            {
                Session["Mensaje"] = ex.Message;
            }
            finally
            {
                ((Site2)Master).muestraMensajes();
            }
        }
        
        /// <summary>
        /// Permite agregar los códigos seleccionados a la reserva
        /// </summary>
        protected void AgregarReserva()
        {
            List<ReservaBE> listSeleccion = new List<ReservaBE>();

            foreach (GridViewRow row in this.gvListado.Rows)
            {
                CheckBox cb = (CheckBox)row.FindControl("cbSelect");
                if (cb.Checked)
                {
                    Label lbl = (Label)row.FindControl("lblCodigo");
                    Label lote = (Label)row.FindControl("lblLote");
                    List<ReservaBE> list = this.ListaMaterial.FindAll(delegate(ReservaBE item) {
                        return (item.codMaterial == lbl.Text && item.lote == lote.Text); });
                    List<ReservaBE> lista = this.ListaReserva.FindAll(delegate(ReservaBE item)
                    {
                        return (item.codMaterial == lbl.Text && item.lote == lote.Text);
                    });
                    if (lista.Count == 0)
                    {
                        listSeleccion.AddRange(list);
                    }
                }           
            }

            if (listSeleccion.Count > 0)
            {
                this.gvReserva.DataSource = listSeleccion;
                this.ListaReserva = listSeleccion;
                this.txtFechaDesde.Text = DateTime.Now.ToShortDateString();
                DateTime fechaValida = (Session["fechaHasta"] != null) ? Convert.ToDateTime(Session["fechaHasta"]) : DateTime.Now;
                this.txtFechaHasta.Text = fechaValida.ToShortDateString();
                this.gvReserva.DataBind();
                this.mpeReserva.Show();
            }
            else 
            {
                Session["Mensaje"] = "Por favor seleccione al menos un vehículo...";
                ((Site2)Master).muestraMensajes();
            }
        }

        protected void AgregarCampania()
        {
            List<ReservaBE> listSeleccion = new List<ReservaBE>();
            List<string> lstLote = new List<string>();

            foreach (GridViewRow row in this.gvListado.Rows)
            {
                CheckBox cb = (CheckBox)row.FindControl("cbSelect");
                if (cb.Checked)
                {
                    Label lbl = (Label)row.FindControl("lblCodigo");
                    Label lote = (Label)row.FindControl("lblLote");
                    lstLote.Add(lote.Text);
                    List<ReservaBE> list = this.ListaMaterial.FindAll(delegate(ReservaBE item)
                    {
                        return (item.codMaterial == lbl.Text && item.lote == lote.Text);
                    });
                    List<ReservaBE> lista = this.ListaReserva.FindAll(delegate(ReservaBE item)
                    {
                        return (item.codMaterial == lbl.Text && item.lote == lote.Text);
                    });
                    if (lista.Count == 0)
                    {
                        listSeleccion.AddRange(list);
                    }
                }
            }

            if (listSeleccion.Count > 0)
            {
                this.gvCampania.DataSource = listSeleccion;
                this.ListaReserva = listSeleccion;             
                this.gvCampania.DataBind();
                this.mpeCampania.Show();
                List<GenericBE> respuesta = ParametroBC.Instance.cmbCampana(lstLote);
                if (respuesta.Count == 0)
                {
                    GenericBE objBlank = new GenericBE();
                    objBlank.Codigo = string.Empty; objBlank.Descripcion = string.Empty;
                    respuesta.Add(objBlank);
                }
                this.ddlTipo.DataSource = respuesta;
                this.ddlTipo.DataTextField = "Descripcion";
                this.ddlTipo.DataValueField = "Codigo";
                this.ddlTipo.DataBind();
            }
            else
            {
                Session["Mensaje"] = "Por favor seleccione al menos un vehículo...";
                ((Site2)Master).muestraMensajes();
            }
        }

        /// <summary>
        /// Permite quitar los materiales seleccionados
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnQuitarReserva_Click(object sender, EventArgs e)
        {
            this.QuitarItems(this.gvReserva);           
        }

        protected void btnQuitarCampania_Click(object sender, EventArgs e)
        {
            this.QuitarItems(this.gvCampania);     
        }

        protected void QuitarItems(GridView gv)
        {
            foreach (GridViewRow row in gv.Rows)
            {
                CheckBox cb = (CheckBox)row.FindControl("cbSelect");
                if (cb.Checked)
                {
                    Label lbl = (Label)row.FindControl("lblCodigo");
                    Label lote = (Label)row.FindControl("lblLote");

                    int nroQuitados = this.ListaReserva.RemoveAll(delegate(ReservaBE item)
                    {
                        return (item.codMaterial == lbl.Text && item.lote == lote.Text);
                    });
                }
            }

            gv.DataSource = this.ListaReserva;
            gv.DataBind();   
        }


        /// <summary>
        /// Permite generar una reserva
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnReservar_Click(object sender, ImageClickEventArgs e)
        {
            this.GenerarReserva();
        }

        protected void btnAsignarCampania_Click(object sender, ImageClickEventArgs e)
        {
            this.AsignarCampania();
        }

        /// <summary>
        /// 
        /// </summary>
        protected void GenerarReserva()
        {
            try
            {
                UsuarioWebBE uWeb = new UsuarioWebBE();
                uWeb = (UsuarioWebBE)HttpContext.Current.Session["UsuarioWeb"];

                if (!string.IsNullOrEmpty(this.txtCodCliente.Text))
                {

                    DateTime fecInicio = (!string.IsNullOrEmpty(this.txtFechaDesde.Text)) ? Convert.ToDateTime(this.txtFechaDesde.Text) :
                        DateTime.Now;
                    DateTime fecFinal = (!string.IsNullOrEmpty(this.txtFechaHasta.Text)) ? Convert.ToDateTime(this.txtFechaHasta.Text) :
                        DateTime.Now;
                    List<string> lstLote = new List<string>();
                    List<GenericBE> lstStatus = new List<GenericBE>();
                    GenericBE sta;
                    if (this.gvReserva.Rows.Count > 0)
                    {
                        foreach (GridViewRow row in this.gvReserva.Rows)
                        {
                            Label lote = (Label)row.FindControl("lblLote");
                            lstLote.Add(lote.Text);

                            Label status = (Label)row.FindControl("lblStatus");

                            sta = new GenericBE();
                            sta.Codigo = lote.Text;
                            sta.Descripcion = status.Text;
                            lstStatus.Add(sta);
                        }
                        List<string> respuesta = StockBC.Instance.GenerarReserva(fecInicio, fecFinal, uWeb.OrgVentas, uWeb.CanalDist,
                                this.txtCodCliente.Text, uWeb.OfVentas, lstLote, lstStatus);
                        string rpta = string.Empty;
                        foreach (string s in respuesta)
                        {
                            if (respuesta.Count() > 1)
                            {
                                rpta = "- " + s + "<br/>" + rpta;
                            }
                            else
                            {
                                rpta = "- " + s;
                            }
                        }
                        Session["Mensaje"] = rpta;
                        ((Site2)Master).muestraMensajes();
                    }

                    this.mpeReserva.Hide();
                }
                else
                {
                    Session["Mensaje"] = "Debe seleccionar un cliente...";
                    ((Site2)Master).muestraMensajes();
                }
            }
            catch
            {
                Session["Mensaje"] = "Error al intentar grabar los datos...";
                ((Site2)Master).muestraMensajes();
            }
        }

        protected void AsignarCampania()
        {
            try
            {
                UsuarioWebBE uWeb = new UsuarioWebBE();
                uWeb = (UsuarioWebBE)HttpContext.Current.Session["UsuarioWeb"];
                List<string> lstLote = new List<string>();
                List<GenericBE> lstStatus = new List<GenericBE>();
                GenericBE sta;
                if (this.gvCampania.Rows.Count > 0)
                {
                    foreach (GridViewRow row in this.gvCampania.Rows)
                    {
                        Label lote = (Label)row.FindControl("lblLote");
                        lstLote.Add(lote.Text);

                        Label status = (Label)row.FindControl("lblStatus");

                        sta = new GenericBE();
                        sta.Codigo = lote.Text;
                        sta.Descripcion = status.Text;
                        lstStatus.Add(sta);
                    }
                    string pCamp = ddlTipo.SelectedValue;
                    List<string> respuesta = StockBC.Instance.AsignarCampana(lstLote, lstStatus, pCamp, uWeb);
                    string rpta = string.Empty;
                    foreach (string s in respuesta)
                    {
                        if (respuesta.Count() > 1)
                        {
                            rpta = "- " + s + "<br/>" + rpta;
                        }
                        else
                        {
                            rpta = s;
                        }
                    }
                    Session["Mensaje"] = rpta;
                    ((Site2)Master).muestraMensajes();
                }

                this.mpeCampania.Hide();
            }
            catch
            {
                Session["Mensaje"] = "Error al intentar grabar los datos...";
                ((Site2)Master).muestraMensajes();
            }
        }

        protected void gvListado_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.gvListado.PageIndex = e.NewPageIndex;
            this.gvListado.DataSource = this.ListaMaterial;
            this.gvListado.DataBind();
        }


        /************************METODOS AGREGADOS PARA PEDIDOS****************************/
       
        protected void rblReferencia_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.divReferencia.Visible = (this.rblReferencia.SelectedValue == "S") ? true : false;
        }

        protected void btnQuitarPedido_Click(object sender, EventArgs e)
        {
            this.QuitarItems(this.gvReserva);
        }

        protected void btnCrearPedido_Click(object sender, EventArgs e)
        {
            this.ListaReserva = null;
            this.AgregarPedido();
        }


        protected void AgregarPedido()
        {
            List<ReservaBE> listSeleccion = new List<ReservaBE>();
            List<string> lstLote = new List<string>();

            foreach (GridViewRow row in this.gvListado.Rows)
            {
                CheckBox cb = (CheckBox)row.FindControl("cbSelect");
                if (cb.Checked)
                {
                    Label lbl = (Label)row.FindControl("lblCodigo");
                    Label lote = (Label)row.FindControl("lblLote");
                    lstLote.Add(lote.Text);
                    List<ReservaBE> list = this.ListaMaterial.FindAll(delegate(ReservaBE item)
                    {
                        return (item.codMaterial == lbl.Text && item.lote == lote.Text);
                    });
                    List<ReservaBE> lista = this.ListaReserva.FindAll(delegate(ReservaBE item)
                    {
                        return (item.codMaterial == lbl.Text && item.lote == lote.Text);
                    });
                    if (lista.Count == 0)
                    {
                        listSeleccion.AddRange(list);
                    }
                }
            }

            if (listSeleccion.Count > 0)
            {
                this.gvPedidos.DataSource = listSeleccion;
                this.ListaReserva = listSeleccion;
                this.gvPedidos.DataBind();
                this.mpePedido.Show();               
            }
            else
            {
                Session["Mensaje"] = "Por favor seleccione al menos un vehículo...";
                ((Site2)Master).muestraMensajes();
            }
        }

        protected void btnAceptarPedido_Click(object sender, ImageClickEventArgs e)
        {
            this.CrearPedido();
        }

        protected void CrearPedido()
        {
            try
            {
                PedidoBE pedido = null;
                UsuarioWebBE usr = (UsuarioWebBE)Session["UsuarioWeb"];
                bool flag = true;
                string nroPedido = string.Empty;
                if (this.rblReferencia.SelectedValue == "S")
                {
                    string nroReferencia = this.txtReferencia.Text;
                   
                    pedido = PedidoBC.Instance.leer(nroReferencia, usr);

                    if (pedido != null)
                    {
                        nroPedido = pedido.NumPedido;
                        TimeSpan resta = DateTime.Now.Date.Subtract(pedido.FechaValidez.Date);

                        if (resta.TotalDays >= 0)
                        {
                            flag = false;
                            Session["Mensaje"] = "La fecha de validez de la cotización a vencido...";
                            ((Site2)Master).muestraMensajes();
                        }
                    }
                    else 
                    {
                        flag = false;
                        Session["Mensaje"] = "No existe el documento ingresado...";
                        ((Site2)Master).muestraMensajes();
                    }
                }

                if (flag)
                {
                    List<string> listaCodigos = new List<string>();

                    if (this.gvPedidos.Rows.Count > 0)
                    {
                        foreach (GridViewRow row in this.gvPedidos.Rows)
                        {
                            Label lbl = (Label)row.FindControl("lblCodigo");
                            Label lLote = (Label)row.FindControl("lblLote");

                            Label status = (Label)row.FindControl("lblStatus");
                            listaCodigos.Add(lbl.Text + "$" + lLote.Text + "$" + status.Text);
                        }
                    }

                    Session["ListaCodigos"] = listaCodigos;

                    if (this.rblReferencia.SelectedValue == "S")
                    {
                        Session["PedidoReferencia"] = nroPedido;
                        ClienteBE cliente = ClienteBC.Instance.leer(pedido.CodCliente, usr);
                        Session["Cliente"] = cliente;
                        Session["Pedido"] = null;
                        Session["Referencia"] = "S";

                    }
                    else
                    {
                        Session["Referencia"] = "N";
                    }

                    Response.Redirect("DocVenta.aspx?accion=gen");
                    this.mpeCampania.Hide();
                }
            }
            catch
            {
                Session["Mensaje"] = "Error al intentar generar la operación...";
                ((Site2)Master).muestraMensajes();
            }
        }

    }
}